import { IVec2 } from "../../util/Defined";
import { Matrix } from "../math/Matrix";
import { Rect } from "../math/Rect";
import { Vec2 } from "../math/Vec2";

export enum ShapeType {
    /** 圆形 */
    circle,
    /** 矩形(不支持旋转) */
    rect,
    /** 盒子 */
    box,
    /** 多边形 */
    polygon,

    //===以下图形适合用来做技能范围判定，不能用来做常规碰撞检测

    /** 镂空圆形 */
    hollowCircle,
    /** 扇形 */
    sector,
}

/**
 * 图形基类
 */
export abstract class BaseShape {

    /** 中心点偏移 */
    offset = new Vec2();
    /** AABB盒子 */
    worldAABB = new Rect();

    constructor(
        /** 中心点偏移 */
        offset?: IVec2
    ) {
        if (offset) {
            this.offset.setPosTo(offset);
        }
    }

    /**
     * 获取图形类型
     */
    abstract getType(): ShapeType

    /**
     * 更新图形
     * @param pos 世界位置
     * @param trans 变换
     */
    abstract update(pos: Readonly<IVec2>, trans?: Matrix): this

    /**
     * 碰撞检测
     * @param shape 
     */
    abstract testCollide(shape: Readonly<BaseShape>): boolean

}